#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

int code = 0;

int main()
{
    pid_t id = fork();
    if(id < 0)
    {
        perror("fork");
        exit(1); //标识进程运行完毕，结果不正确
    }
    else if(id == 0)
    {
        //子进程
        int cnt = 5;
        while(cnt)
        {
            printf("cnt: %d, 我是子进程, pid: %d, ppid : %d\n", cnt, getpid(), getppid());
            sleep(1);
            //cnt--;
            //int * p = NULL;
            //*p = 100;
           // int a = 10;
           // a /= 0;
        }
        code = 15;
        exit(15);
    }
    else
    {
        //父进程
        printf("我是父进程, pid: %d, ppid: %d\n", getpid(), getppid());
        //sleep(7);
        //pid_t ret = wait(NULL); //阻塞式的等待
        int status = 0; 
        pid_t ret = waitpid(id, &status, 0); //阻塞式的等待
        if(ret > 0)
        {
            // 0x7F -> 0000.000 111 1111
            printf("等待子进程成功, ret: %d, 子进程收到的信号编号: %d,子进程退出码: %d\n",\
                    ret, status & 0x7F ,(status >> 8)&0xFF); //0xff --> 0000...000 1111 1111
            printf("code: %d\n", code);
        }
        //没有意义，仅仅为了对比演示
        //while(1)
        //{
        //    printf("我是父进程, pid: %d, ppid: %d\n", getpid(), getppid());
        //    sleep(1);
        //}
    }
}

//int main()
//{
//    printf("Can you see me?");
//    sleep(3);
//    _exit(13);
//
//
////int sum(int top)
////{
////    int s = 0;
////    for(int i = 1; i < top; i++)
////    {
////        s += i;
////    }
////
////    _exit(222);
////}
////
////int main()
////{
////    printf("hello world1\n");
////    printf("hello world1\n");
////    printf("hello world1\n");
////
////    int res = sum(10);
////    _exit(111);
////
////    printf("hello world2\n");
////    printf("hello world2\n");
////    printf("hello world2\n");
////    printf("hello world2\n");
//////    for(int number = 0; number < 150; number++)
////    {
////        printf("%d: %s\n", number, strerror(number));
////    }
////    int ret = 0;
////    printf("hello world: pid: %d, ppid: %d\n", getpid(), getppid());
////    int res = sum(100);
////    if(res != 5050)
////    {
////        //代码将来的运行结果不正确
////        ret = 1; //运行结果不正确
////    }
////    return ret;
//}

//int main()
//{
//    const char *str = "aaa";
//    const char *str1 = "aaa";
//
//    printf("%p\n", str);
//    printf("%p\n", str1);
//
// //   printf("我是父进程\n");
//
// //   pid_t id = fork();
// //   if(id < 0)
// //   {
// //       printf("创建子进程失败\n");
// //       return 1;
// //   }
// //   else if(id == 0)
// //   {
// //       // 子进程
// //       while(1)
// //       {
// //           printf("我是子进程: pid: %d, ppid: %d\n", getpid(), getppid());
// //           sleep(1);
// //       }
// //   }
// //   else{
// //       // 父进程
// //       while(1)
// //       {
// //           printf("我是父进程: pid: %d, ppid: %d\n", getpid(), getppid());
// //           sleep(1);
// //       }
// //   }
//    return 0;
//}
